package com.cyj.comment.utils;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import java.util.Scanner;

/**
 * @ClassName CodeGenerator
 * @Description TODO
 * @Author chixiaowai
 * @Date 2023/4/4 8:41
 * @Version 1.0
 */

public class CodeGenerator{
    //数据库连接参数
    public static String driver = "com.mysql.jdbc.Driver";
    public static String url = "jdbc:mysql://localhost:3306/dianping?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true";
    public static String username="root";
    public static String password="root";
    //父级别包名称
    public static String parentPackage = "com.cyj.comment";
    //代码生成的目标路径
    public static String generateTo = "D:\\java project\\comment\\src\\main\\java\\";
    //mapper.xml的生成路径
    public static String mapperXmlPath = "D:\\java project\\comment\\src\\main\\resources\\mapper";
    //作者名
    public static String author = "chixiaowai";

    public static void main(String[] args) {
        generator();
    }

    public static void generator(){
        // 1、创建代码生成器
        AutoGenerator mpg = new AutoGenerator();
        /*
         * 2、创建全局配置对象
         *  1)、可以通过该对象配置生成文件的输出位置，类上的@Author注解等
         *  2)、在下边我们会使用一些常用的配置
         */
        GlobalConfig gc = new GlobalConfig();
        // 获取本项目的项目路径，不过该路径在有些情况下会出现问题，所以一般在设置文件输出路径时我会写绝对路径
        String projectPath = System.getProperty("user.dir");
        System.out.println(projectPath);
        // 设置生成文件的输出路径，这里前部分使用的一个绝对路径，后部分是一个maven项目的目录结构
        gc.setOutputDir(generateTo);
        // 设置生成文件（也就是类）上方的@Author注解
        gc.setAuthor(author);
        //生成后是否打开资源管理器
        gc.setOpen(false);
        //重新生成时文件是否覆盖
        gc.setFileOverride(false);
        // mp生成service层代码，默认接口名称第一个字母有I,去掉Service接口的首字母I
        gc.setServiceName("%sService");
        // 主键策略，这里的策略和您的实际项目需要设置
        // 在 https://blog.csdn.net/qq_36386908/article/details/121465444 文章中讲过主键策略了
        gc.setIdType(IdType.ASSIGN_ID);
        // 定义生成的实体类中日期类型
        gc.setDateType(DateType.ONLY_DATE);
        //开启Swagger2模式
        gc.setSwagger2(true);
        // 将配置加入到代码生成器中
        mpg.setGlobalConfig(gc);

        // 3、数据源配置
        DataSourceConfig dsc = new DataSourceConfig();
        dsc.setUrl(url);
        dsc.setDriverName(driver);
        dsc.setUsername(username);
        dsc.setPassword(password);
        dsc.setDbType(DbType.MYSQL);
        // 将数据源设置仅代码生成器中
        mpg.setDataSource(dsc);

        // 4、包配置
        PackageConfig pc = new PackageConfig();
        // 模块名
//        pc.setModuleName(modelName);
        pc.setParent(parentPackage);
        pc.setController("controller");
        pc.setEntity("entity");
        pc.setService("service");
        pc.setMapper("mapper");

        // 将包配置设置进代码生成器中
        mpg.setPackageInfo(pc);

        // 5、策略配置
        StrategyConfig strategy = new StrategyConfig();
        // 设置表名，根据数据库表生成实体类和其他文件
        strategy.setInclude(("tb_blog"), ("tb_blog_comments"), ("tb_follow"), ("tb_seckill_voucher"), ("tb_shop"),
                ("tb_shop_type"), ("tb_sign"), ("tb_user"), ("tb_user_info"), ("tb_voucher"), ("tb_voucher_order"));

        //数据库表映射到实体的命名策略
        strategy.setNaming(NamingStrategy.underline_to_camel);
        //生成实体时去掉表前缀
        strategy.setTablePrefix("tb_");
        //数据库表字段映射到实体的命名策略
        strategy.setColumnNaming(NamingStrategy.underline_to_camel);
        strategy.setEntityLombokModel(true);
        //设置实体类属性对应表字段的注解
        strategy.setEntityTableFieldAnnotationEnable(true);
        //restful api风格控制器
        strategy.setRestControllerStyle(true);
        //url中驼峰转连字符
        strategy.setControllerMappingHyphenStyle(true);
        // 将策略设置仅代码生成器
        mpg.setStrategy(strategy);
        // 6、执行
        mpg.execute();
    }

    /**
     * 读取控制台输入的表名
     * @param tip
     * @return
     */
    public static String scanner(String tip) {
        Scanner scanner = new Scanner(System.in);
        StringBuilder help = new StringBuilder();
        help.append("请输入" + tip + "：");
        System.out.println(help.toString());
        if (scanner.hasNext()) {
            String ipt = scanner.next();
            if (StringUtils.isNotEmpty(ipt)) {
                return ipt;
            }
        }
        throw new MybatisPlusException("请输入正确的" + tip + "！");
    }
}
